/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BussinesLogic;

import EntidadesCM.AfiliacionCM;
import controller.exceptions.NonexistentEntityException;
import controller.exceptions.PreexistingEntityException;
import Entities.Afiliacion;
import java.io.Serializable;
import Entities.Plan;
import Entities.Categoria;
import Entities.Afiliado;
import Entities.Cuenta;
import controller.AfiliacionJpaController;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 *
 * @author Nas
 */
public class AfiliacionBL implements Serializable {

    AfiliacionJpaController afiliacionJpaController;

    public void crearAfiliacion(AfiliacionCM afiliacionCM) throws PreexistingEntityException, Exception {
        List<Afiliacion> afiliacionAct = new ArrayList<>();

        Afiliacion afiliacion = new Afiliacion();
        afiliacionJpaController = new AfiliacionJpaController();

        Plan plan = new Plan(afiliacionCM.getIdPlan().getIdPlan());
        afiliacion.setIdPlan(plan);

        Categoria categoria = new Categoria(afiliacionCM.getIdCategoria().getIdCategoria());
        afiliacion.setIdCategoria(categoria);

        Afiliado afiliado = new Afiliado(afiliacionCM.getIdAfiliado().getIdAfiliado());
        afiliacion.setIdAfiliado(afiliado);
       
        afiliacion.setIdCuenta(afiliacionCM.getIdCuenta());

        afiliacion.setFechaIni(afiliacionCM.getFechaIni());
        afiliacion.setFechaFin(afiliacionCM.getFechaFin());
        afiliacion.setEstado(afiliacionCM.getEstado());
        afiliacion.setCreateBy(afiliacionCM.getCreateBy());
        afiliacion.setFechaCreate(Calendar.getInstance().getTime());
        afiliacion.setNroFactura(afiliacionCM.getNroFactura());

        afiliacionAct = afiliacionJpaController.findByEstadoAndAfiliado(afiliacion.getIdAfiliado().getIdAfiliado(), "A");
        if (afiliacionAct.size() > 0) {
            afiliacion.setEstado("I");
        }else{
            afiliacion.setEstado("A");
        }
        afiliacionJpaController.create(afiliacion);
    }

    public void modificarAfiliacion(AfiliacionCM afiliacionCM) throws NonexistentEntityException, Exception {
         List<Afiliacion> afiliacionAct = new ArrayList<>();

        Afiliacion afiliacion = new Afiliacion();
        afiliacionJpaController = new AfiliacionJpaController();
        
        afiliacion.setIdAfiliacion(afiliacionCM.getIdAfiliacion());

        Plan plan = new Plan(afiliacionCM.getIdPlan().getIdPlan());
        afiliacion.setIdPlan(plan);

        Categoria categoria = new Categoria(afiliacionCM.getIdCategoria().getIdCategoria());
        afiliacion.setIdCategoria(categoria);

        Afiliado afiliado = new Afiliado(afiliacionCM.getIdAfiliado().getIdAfiliado());
        afiliacion.setIdAfiliado(afiliado);
       
        afiliacion.setIdCuenta(afiliacionCM.getIdCuenta());

        afiliacion.setFechaIni(afiliacionCM.getFechaIni());
        afiliacion.setFechaFin(afiliacionCM.getFechaFin());
        afiliacion.setEstado(afiliacionCM.getEstado());
        afiliacion.setCreateBy(afiliacionCM.getCreateBy());
        afiliacion.setFechaCreate(Calendar.getInstance().getTime());
        afiliacion.setNroFactura(afiliacionCM.getNroFactura());

        afiliacionAct = afiliacionJpaController.findByEstadoAndAfiliado(afiliacion.getIdAfiliado().getIdAfiliado(), "A");
        if (afiliacionAct.size() > 0) {
            afiliacion.setEstado("I");
        }else{
            afiliacion.setEstado("A");
        }

        afiliacionJpaController.edit(afiliacion);
    }

    public void eliminarAfilicion(Integer id) throws NonexistentEntityException {
        afiliacionJpaController = new AfiliacionJpaController();
        afiliacionJpaController.destroy(id);

    }

    public List<AfiliacionCM> buscarAllAfiliaciones() {
        List<AfiliacionCM> afiliacionesCM = new ArrayList<>();
        afiliacionJpaController = new AfiliacionJpaController();
        AfiliacionCM afiliacionCM;

        for (Afiliacion afiliacion : afiliacionJpaController.findAfiliacionEntities()) {
            afiliacionCM = new AfiliacionCM();
            afiliacionCM.setIdAfiliacion(afiliacion.getIdAfiliacion());
            afiliacionesCM.add(afiliacionCM);
        }
        return afiliacionesCM;
    }

    public AfiliacionCM buscarAfiliacionById(Integer id) {
        AfiliacionCM afiliacionCM = new AfiliacionCM();
        Afiliacion afiliacion;
        afiliacionJpaController = new AfiliacionJpaController();
        afiliacion = afiliacionJpaController.findAfiliacion(id);
        if (afiliacion != null) {
            afiliacionCM.setIdAfiliacion(afiliacion.getIdAfiliacion());
        }
        return afiliacionCM;

    }

    public List<AfiliacionCM> buscarAfiliacionesByIdAfiliado(Integer id) {
        List<AfiliacionCM> afiliacionesCM = new ArrayList<>();
        List<Afiliacion> afiliaciones;
        afiliacionJpaController = new AfiliacionJpaController();
        afiliaciones = afiliacionJpaController.findByIdAfiliado(id);
        if (afiliaciones.size() > 0) {
            AfiliacionCM afiliacionCM;
            for (Afiliacion afiliacion : afiliaciones) {
                afiliacionCM = new AfiliacionCM();
                afiliacionCM.setIdAfiliacion(afiliacion.getIdAfiliacion());
                //afiliacionCM.setIdAfiliado(new AfiliadoCM());
                afiliacionCM.setEstado(afiliacion.getEstado());
                afiliacionCM.setFechaIni(afiliacion.getFechaIni());
                afiliacionCM.setFechaFin(afiliacion.getFechaFin());
                afiliacionCM.setNroFactura(afiliacion.getNroFactura());
                afiliacionCM.setIdPlan(new PlanBL().convertirPlanCM(afiliacion.getIdPlan()));

                afiliacionCM.setIdCategoria(new CategoriaBL().convertirCategoriaCM(afiliacion.getIdCategoria()));
                afiliacionesCM.add(afiliacionCM);
            }
            return afiliacionesCM;
        } else {
            return null;
        }
    }
}
